package com.dyg.util;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.junit.Before;
import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class RedisUtil {
	
	JedisPool jedisPool;
	Jedis jedis;
	
	@Before
	public void setUp(){
		jedisPool = new JedisPool(new JedisPoolConfig(), "127.0.0.1");
		jedis = jedisPool.getResource();
		//jedis.auth(password);
	}
	
	@Test
	public void testGet(){
		//jedis.del("userlist");
		System.out.println(jedis.get("userlist"));
		//删除所有的key
		//jedis.flushDB();
		//返回当前库中所有的key
		Set<String> keys = jedis.keys("*");
		System.out.println("返回当前库中所有的key:"+keys);
	}
	
	@Test
	public void testBasicString(){
		//添加数据
		jedis.set("name", "dyg001");
		//执行结果
		System.out.println("添加数据："+jedis.get("name"));
		
		
		//修改数据
		//1，在原来基础上修改
		jedis.append("name", "dyg002");
		System.out.println("在原来基础上修改："+jedis.get("name"));
		
		//2,直接覆盖原来的数据
		jedis.set("name", "dyg003");
		System.out.println("直接覆盖原来的数据："+jedis.get("name"));
		
		
		//删除数据
		jedis.del("name");
		System.out.println("删除数据："+jedis.get("name"));
		
		
		jedis.mset("name","dyg001","password","dyg123");
		System.out.println(jedis.mget("name","password"));;
		
	}
	
	
	@Test
	public void testMap(){
		Map<String,String> map = new HashMap<String,String>();
		map.put("name","dyg001");
		map.put("password", "dyg123");
		jedis.hmset("user", map);
		//取出user中的name，执行结果返回[dyg001]  是一个泛型的list
		//第一个参数是存入redis中map对象的key,后面是放入map中的对象的key,后面的key可以跟多个.是可变参数 
		List<String> nameList = jedis.hmget("user", "name");
		System.out.println("取出user中的name:"+nameList);
		
		//删除map中的某个键值
		jedis.hdel("user", "password");
		List<String> passwordList = jedis.hmget("user", "password");
		System.out.println("删除map中的某个键值:"+passwordList);
		
		
		//返回key为user的键中存放的值的个数
		Long userLen = jedis.hlen("user");
		System.out.println("返回key为user的键中存放的值的个数:"+userLen);
		
		//是否存在key为user的记录 返回true
		Boolean exists = jedis.exists("user");
		System.out.println("是否存在key为user的记录 返回true:"+exists);
		
		//返回map中的所有key
		Set<String> hkeys = jedis.hkeys("user");
		System.out.println("返回map中的所有key:"+hkeys);
		
		//返回map中的所有value
		List<String> hvals = jedis.hvals("user");
		System.out.println("返回map中的所有key:"+hvals);
		
		Iterator<String> iterator = jedis.hkeys("user").iterator();
		while (iterator.hasNext()) {
			String key = iterator.next();
			
			List<String> hmget = jedis.hmget("user", key);
			System.out.println(hmget);
		}
	}
	
	@Test
	public void testList(){
		//先清空所有的内容
		jedis.del("userlist");
		System.out.println(jedis.lrange("userlist", 0, -1));
		
		//list添加数据
		jedis.lpush("userlist", "user001");
		jedis.lpush("userlist", "user002");
		jedis.lpush("userlist", "user003");
		
		//取出所有数据
		//第一个是list的key,第二个是起始位置，第三个是结束位置，jedis.llen获取长度为-1,表示获取全部 
		List<String> lrange = jedis.lrange("userlist", 0, -1);
		
		System.out.println("userlist:"+lrange);
	}
	
	
	@Test
	public void testSet(){
		
		//添加数据
		jedis.sadd("sname", "dyg001");
		jedis.sadd("sname", "dyg002");
		jedis.sadd("sname", "dyg003");
		
		//删除数据
		//jedis.srem("sname", "dyg003");
		
		//获取所有加入的value
		Set<String> smembers = jedis.smembers("sname");
		System.out.println("获取所有加入的value:"+smembers);
		
		//判断某元素是否是set集合中的元素
		Boolean sismember = jedis.sismember("sname", "1212");
		System.out.println("判断某元素是否是set集合中的元素:"+sismember);
		
		//返回集合中的第一个元素
		String srandmember = jedis.srandmember("sname");
		System.out.println("返回集合中的第一个元素:"+srandmember);
		
		//返回集合中元素的个数
		Long scard = jedis.scard("sname");
		System.out.println("返回集合中元素的个数:"+scard);
		
	}
	
	@Test
	public void test() throws InterruptedException{
		
		//key中传入的可以用通配符
		
		//返回当前库中所有的key
		Set<String> keys = jedis.keys("*");
		System.out.println("返回当前库中所有的key:"+keys);
		
		//类似于模糊匹配
		Set<String> keys2 = jedis.keys("*name");
		System.out.println("类似于模糊匹配:"+keys2);
		
		//删除key为***的对象，成功返回1，失败（或不存在）返回0
		Long del = jedis.del("aaa");
		System.out.println("删除key为***的对象，成功返回1，失败（或不存在）返回0:"+del);
		
		//返回指定key的有效时间，如果是-1则表示永久有效
		Long ttl2 = jedis.ttl("sname");
		System.out.println("返回指定key的有效时间:"+ttl2);
		
		//指定key的存活时间（有效时间） 时间为秒
		jedis.setex("sname", 10, "min");
		
		//睡眠时间5秒
		Thread.sleep(5000);
		//查询剩余存活时间
		Long ttl = jedis.ttl("sname");
		System.out.println("sname剩余存活时间："+ttl);
		
		//检查key是否存在
		Boolean exists = jedis.exists("sname");
		System.out.println("检查key是否存在:"+exists);
		
		//排序
		
		//先清除数据
		jedis.del("a");
		jedis.lpush("a", "1");
		jedis.lpush("a", "2");
		jedis.lpush("a", "3");
		jedis.lpush("a", "4");
		
		List<String> lrange = jedis.lrange("a", 0, -1);
		System.out.println("排序前："+lrange);
		//排序
		List<String> sort = jedis.sort("a");
		
		System.out.println("排序后："+sort);
		
		List<String> lrange2 = jedis.lrange("a", 0, -1);
		System.out.println("排序后获取："+lrange2);
		
		
		
	}
	
}
